package com.qf.controller;/*
 *保护你的大熊
 *2021/11/16
 *21:35
 */

import com.qf.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

//@RestController
//相当于在类上加入@Controller注解  并相当于在这个类的每个方法上加入@ResponseBody注解
//一旦类上加入这个注解，那么这个类的所有方法的返回值都是JSON格式字符串，会被自动转换
@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 默认支持的参数类型
     * @param request
     * @param model
     * @return
     */
    @RequestMapping("/test1")
    public String test1(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model){
        Integer id = Integer.parseInt(request.getParameter("id"));
        String name = request.getParameter("name");
        System.out.println("======id======" +id);
        System.out.println("======name======" + name);
        return "hello";
    }

    /**
     * 接收基本类型传参
     * 要求参数的变量名称必须等于页面传入的参数名称
     * @param id
     * @param name
     * @param model
     * @return
     */
    @RequestMapping("/test2")
    public String test2(Integer id,String name,Model model){
        System.out.println("======id======" +id);
        System.out.println("======name======" + name);
        return "hello";
    }

    /**
     * 接收实体类对象类型传参
     * 要求传入参数的变量名，必须等于实体类中的属性名和类型
     * @param user
     * @param model
     * @return
     */
    @RequestMapping("/test3")
    public String test3(User user, Model model){
        System.out.println("======user======" + user);
        return "hello";
    }

    /**
     * 接收数组类型数据
     * @param hobby
     * @param model
     * @return
     */
    @RequestMapping("/test4")
    public String test4(String hobby[], Model model){
        System.out.println("======hobby======" + hobby.toString());
        return "hello";
    }

    /**
     * 接收集合类型
     * 参数：userList[0].id=1&userList[0].name=shine&userList[0].gender=true&userList[1].id=2&userList[1].name=zhangsan
     * 使用规则：集合变量名称[集合索引号]，集合泛型对象的属性名称=值
     *          集合类型不能放入Controller方法中直接接收，需要放入实体类中才可以使用
     *  @param
     * @return
     */
    @RequestMapping("/test5")
    public String test5(User user){
        for (User u : user.getUserList()) {
            System.out.println(u);
        }
        return "hello";
    }

    /**
     * rest风格传参
     * @param id
     * @param name
     * @return
     */
    @RequestMapping("/test6/{id}/{name}")
    public String test6(@PathVariable("id") Integer id,@PathVariable("name") String name){
        System.out.println("=================" + id);
        System.out.println("=================" + name);
        return "hello";
    }

    @RequestMapping("/test7")
    public String test7(){

        /**
         * 请求转发：
         *      请求转发中request对象中的内容可以带到转发后的方法中,请求转发url路径不变
         *      请求转发只能用在内部网址，无法跳转到外部网址
         *      SpringMvc的controller方法必须返回string字符串类型，
         *      字符串必须forward：开头后面跟转发后的路径
         */
        return "forward:/hello/test";
    }

    @RequestMapping("/test8")
    public String test8(){

        /**
         * 重定向：
         *      重定向中request对象中的内容不可以带到转发后的方法中,url路径发生变化
         *      重定向可以跳转到内部，外部任意网址
         *      SpringMvc的controller方法必须返回string字符串类型，
         *      字符串必须redirect：开头后面跟转发后的路径
         */
        return "redirect:http://www.baidu.com";
    }

    /**
     *Json格式数据自动转换
     * @param user
     * @return
     */
    @RequestMapping("/test9")
    @ResponseBody
    public User testJson(@RequestBody User user){
        System.out.println("==========" + user);
        return user;
    }
}
